const qs = require('qs')

const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')
const { get, set } = require('./src/db/redis')
const { access, error } = require('./src/utils/log')

// session 数据
// const SESSION_DATA = {}

// 获取 cookie 的过期时间
const getCookieExpires = () => {
    // 获取当前时间
    const d = new Date()
    // 设置时间为当前时间加24小时
    d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
    // 最后返回这个时间
    return d.toUTCString()
}

// 用于处理 post data
const getPostData = (req) => {
    const promise = new Promise((resolve, reject)=> {
        // 如果是 GET 请求，返回一个空就行了，并不是错误
        if (req.method !== 'POST') {
            resolve({})
            return
        }
        // 如果 content-type 给错了话，返回一个空就行了，也不是错误
        if (req.headers['content-type'] !== 'application/json') {
            resolve({})
            return
        }

        if (req.method === 'POST') {
            let postData = ''
            req.on('data', chunk => {
              postData += chunk.toString()
            })
            req.on('end', () => {
                // 如果数据为空的话，返回一个空对象
                if (!postData) {
                    resolve({})
                    return
                }
                resolve(
                    JSON.parse(postData)
                )
            })
          }
    })
    return promise
}

const serverHandle = (req, res) => {
    // 记录 access log
    const basicContent = `${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${Date.now()}`
    access(basicContent)

    // 获取 Path
    const url = req.url
    req.path = url.split('?')[0]

    // 设置返回格式为JSON格式
    res.setHeader('Content-type', 'application/json')

    // 解析 query
    req.query = qs.parse(url.split('?')[1])

    // 解析 cookie
    req.cookie = {}
    const cookieStr = req.headers.cookie || ''  // k1=v1;k2=v2;k3=v3
    cookieStr.split(';').forEach(item => {
        if (!item) {
            return
        }
        const arr = item.split('=')
        const key = arr[0].trimStart()
        const value = arr[1]
        req.cookie[key] = value
    })

    // // 解析 session
    // let needSetCookie = false
    // let userId = req.cookie.userid
    // // 如果有 userId
    // if (userId) {
    //     //  就看下 session中有没有对应的值
    //     // 如果没有的话，就给它初始化一下
    //     if (!SESSION_DATA[userId]) {
    //         SESSION_DATA[userId] = {}
    //     }
    //     // 如果没有 userId, 就需要设置 cookie
    //     // 就把 userId 初始化一下
    // } else {
    //     needSetCookie = true
    //     userId = `${Date.now()}_${Math.random()}`
    //     SESSION_DATA[userId] = {}
    // }
    // // 最后赋值 session 为 SESSION_DATA[userId]
    // req.session = SESSION_DATA[userId]

    // 解析 session 使用 redis
    let needSetCookie = false
    let userId = req.cookie.userid
    
    if (!userId) {
        needSetCookie = true
        userId = `${Date.now()}_${Math.random()}`
        // 如果没有 userId 的话，初始化 redis 中的 session 值
        set(userId, {})
    }
    // 然后获取 userId 对应的值
    req.sessionId = userId
    get(req.sessionId).then(sessionData => {
        if (sessionData == null) {
            // 初始化 redis 中的 session 值
            set(req.sessionId, {})
            // 设置 session
            req.session = {}
        }
        // 设置 session
        req.session = sessionData
        console.log('req.session', req.session)

        return getPostData(req)
    // 处理 post data
    }).then(postData => {
        req.body = postData

        // 处理 blog 路由

        const blogResult = handleBlogRouter(req, res)
        if (blogResult) {

            if (needSetCookie) {
                res.setHeader('Set-Cookie', `userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
            }

            blogResult.then(blogData => {
                res.end(
                    JSON.stringify(blogData)
                )
            })
            return
        }

        // // 传入 req 和 res 到 blogData 中
        // const blogData = handleBlogRouter(req, res)
        // // 如果 blogData 存在的话就获取那个值，并将值转换为字符串
        // if (blogData) {
        //     res.end(
        //         JSON.stringify(blogData)
        //     )
        //     return
        // }

        // 处理 user 路由
        const userResult = handleUserRouter(req, res)
        if (userResult) {

            if (needSetCookie) {
                res.setHeader('Set-Cookie', `userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
            }

            userResult.then(userData =>{
                res.end(
                    JSON.stringify(userData)
                )
            })
            return
        }

        // 未命中路由返回 404
        // 改写一下头和状态码
        res.writeHead(404, {"Content-type": "text/plain"})
        res.write("404 not found\n")
        res.end()
    })
}

module.exports = serverHandle